home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / comm / comm5 / nwsbrkr5.lha / Reader / NewsBreaker / src / app / Tools.c < prev   
C/C++ Source or Header  |  1996-12-16  |  9KB  |  345 lines

  1. /*
  2.  * Tools.c
  3.  *
  4.  * Sammlung nützlicher Funktionen
  5.  *
  6.  * freenull             Routine für Speicherfreigabe
  7.  * ActivateTabGadget    aktiviere erstes Tabcyle-Gadget
  8.  * OpenLib              OpenLibrary mit Fehlermeldung
  9.  * CheckErr             UMS-Error - Fehlermeldung in EasyRequest
  10.  * ErrorBeep
  11.  * StrDup               kopiert und alloziert Stringspace
  12.    
  13.    todo 
  14.    WindowClass 
  15.    - WC_OPEN, WC_CLOSE
  16.    - winpointer
  17.    - Ereignistabelle als globale Execliste für die application.
  18.      Events aufnehmen. austragen. ändern. ausgeben.
  19.      Signal triggert --> Auswerten lt. Tabelle --> Routine starten
  20.      Problem: Datenstruktur der Ereignistabelle
  21.  */
  22.  
  23. /* Tools.c: weitere kleine Routinen aufnehmen, todo */
  24.  
  25. //freenull.c            /* Routine für Speicherfreigabe */
  26.  
  27. /* freenull */
  28.  
  29. void 
  30. FreeNull (void *Pointer)
  31. {
  32.   if (Pointer)
  33.     {
  34.       free (Pointer);
  35.       Pointer = NULL;
  36.     }
  37. }
  38.  
  39.  
  40. //ActivateTabGadget.c   /* aktiviere erstes Tabcyle-Gadget */
  41.  
  42. /*
  43.  * ActivateTabGadget()
  44.  *
  45.  * This function scans a window's gadget list and activates the
  46.  * first gadget that supports tab cycling.
  47.  *
  48.  * It should be called when your window gets a VANILLAKEY message
  49.  * with a TAB code (0x09).  This gives the user a way to start
  50.  * tab cycling through gadgets.
  51.  */
  52.  
  53. void 
  54. ActivateTabGadget (struct Window *window)
  55. {
  56.   struct Gadget *gad;
  57.  
  58.   for (gad = window->FirstGadget; gad != NULL; gad = gad->NextGadget)
  59.     {
  60.       if ((gad->Flags & GFLG_TABCYCLE) && !(gad->Flags & GFLG_DISABLED))
  61.     {
  62.       ActivateGadget (gad, window, NULL);
  63.       break;
  64.     }
  65.     }
  66. }
  67.  
  68.  
  69. //OpenLib.c             /* OpenLibrary mit Fehlermeldung     */
  70.  
  71.  
  72. /*
  73.  * OpenLib
  74.  *
  75.  * öffnet Library, bei Mißerfolg Fehlermeldung mit Text.
  76. todo: libraries in Array.
  77.  *
  78.  * INPUTS
  79.  *   UBYTE        *libName   - String mit Library-[Pfad]/Name
  80.  *   unsigned long version   - Die älteste noch akzeptierte Version
  81.  *
  82.  * RESULT
  83.  *   Zeiger auf Library-Struktur, oder NULL bei einem Fehler
  84.  */
  85.  
  86. struct Library *
  87. OpenLib (UBYTE * libName, unsigned long version)
  88. {
  89.   struct Library *LibBase;
  90.  
  91.   LibBase = OpenLibrary (libName, version);
  92.  
  93.   if (LibBase == NULL)
  94.     {
  95.       printf ("Hinweis:\n"
  96.           "Library '%s', Version %ld konnte nicht geöffnet werden.\n\n"
  97.           "Bitte legen Sie diese Library in das passende Verzeichnis.\n"
  98.           "Starten Sie dann erneut " NB_NAME ".\n", libName, version);
  99.     }
  100.   return (LibBase);
  101. }
  102.  
  103.  
  104. //CheckErr.c            /* UMS-Error - Fehlermeldung  */
  105.  
  106. /* für Kleinigkeiten: */
  107.  
  108. void 
  109. ErrorBeep (void)
  110. {
  111.   DisplayBeep (NULL);
  112. }
  113.  
  114. /* für größere Fehler */
  115.  
  116. BOOL 
  117. CheckErr (void)
  118. {
  119.   UMSError err;
  120.   err = UMSErrNum (account);
  121.  
  122.   /* Fehler aufgetreten? */
  123.   if (err != UMSERR_OK)
  124.     {
  125.       STRPTR errorstring = UMSErrTxt (account);
  126.       STRPTR userhelp = NULL;
  127.       struct EasyStruct myES =
  128.       {
  129.     sizeof (struct EasyStruct),
  130.     0,
  131.     "UMS-Hinweis",
  132.     "(%ld)\n%s\n%s",    /*todo: lokalisieren */
  133.     "Weiter",        /*todo: lokalisieren */
  134.       };
  135.  
  136.       switch (err)
  137.       {
  138.       case UMSERR_Unknown:
  139.         userhelp = "Die Fehlerursache ist leider nicht genau einzugrenzen.\n"
  140.                    "Versuchen Sie es erneut. Oder brechen Sie NewsBreaker ab.";
  141.         break;
  142.  
  143.       case UMSERR_NoSubject:
  144.         userhelp = "Fügen Sie bitte eine Betreffzeile (Subject) ein.";
  145.         break;
  146.  
  147.       case UMSERR_ToBig:
  148.         userhelp = "Ihre Nachricht ist zu lang. Kürzen Sie Ihren Text.";
  149.         break;
  150.  
  151.       case UMSERR_NotRunning:
  152.         userhelp = "Der UMS-Server läuft jetzt nicht.\nLoggen Sie sich neu ein.";
  153.         break;
  154.  
  155.       case UMSERR_NoToName:
  156.         userhelp = "Wer soll die Nachricht bekommen? Legen Sie den Empfänger fest.";
  157.         break;
  158.  
  159.       case UMSERR_CfgLocked :
  160.         userhelp = "Der Zugriff auf die UMS-Konfiguration wurde verweigert.\n"
  161.                    "Beenden Sie die dafür verantwortlichen Programme.";
  162.         break;
  163.  
  164.       case UMSERR_MsgCorrupted:
  165.         userhelp = "Die Nachricht ist beschädigt und verfälscht.\n"
  166.                    "Mit einem Hilfsprogramm können Sie vielleicht die Nachricht retten." ;
  167.         break;
  168.  
  169.       case UMSERR_NoHdrSpace :
  170.         userhelp = "Kein Platz für Nachrichten-Header. Ändern Sie die\n"
  171.                    "entsprechenden UMS-Konfigurations-Einstellungen.\n"
  172.                    "Tip: versuchen Sie es mit einer kürzeren Betreffzeile.";
  173.         break;
  174.  
  175.       case UMSERR_NoSuchMsg :
  176.         userhelp = "Diese Nachricht gibt es in Ihrer Messagebase nicht.\n"
  177.                    "Vielleicht wurde die Nachricht von einem Tool gelöscht\n"
  178.                    "oder an einen anderen Platz verschoben.";
  179.         break;
  180.  
  181.       case UMSERR_BadName :
  182.         userhelp = "Der gewählte Name ist nicht zulässig. "
  183.                    "Verwenden Sie einen gültigen Namen.";
  184.         break;
  185.  
  186.       case UMSERR_MissingTag :
  187.         userhelp = "Interner Fehler: Wichtiger Tag wurde vergessen. "
  188.                    "Schreiben Sie bitte dem Autor " NB_AUTHOR_NAME "\n"
  189.                    "einen kurzen Fehlerbericht. Danke!" ;
  190.         break;
  191.  
  192.       case UMSERR_NotFound:
  193.         userhelp = "Der versuchte Zugriff war leider erfolglos.";
  194.         break;
  195.  
  196.       case UMSERR_BadPattern :
  197.         userhelp = "Falsches Namensmuster (Pattern). Überprüfen Sie\n"
  198.                    "Ihre UMS-Konfiguration auf fehlerhafte Pattern.";
  199.         break;
  200.  
  201.  
  202.       case UMSERR_BadVarname  :
  203.         userhelp = "In Ihrer UMS-Konfiguration taucht eine nicht erlaubte\n"
  204.                    "Variable auf. Ändern Sie das: lesen Sie die Dokumentation\n"
  205.                    "über zulässige Konfigurationsvariablen.\n";
  206.         break;
  207.  
  208.       case UMSERR_FsFull  :
  209.         userhelp = "Es gibt keinen Disk-Platz für neue Nachrichten.\n"
  210.                    "Brechen Sie NewsBreaker ab. Starten Sie SetExpire.\n"
  211.                    "Danach Servercontrol Cleanup. Durch dieses Aufräumen\n"
  212.                    "sollte wieder Platz für neue Nachrichten freiwerden.";
  213.         break;
  214.  
  215.       case UMSERR_NoMsgMem  :
  216.         userhelp = "Zuwenig RAM-Speicher, um Nachricht einzulesen.\n"
  217.                    "Entfernen Sie unbenötigte Programme. Schließen Sie geöffnete "
  218.                    "Fenster.";
  219.         break;
  220.       case UMSERR_ServerTerminated  :
  221.         userhelp = "Aus irgendeinem Grund hat sich der UMS-Server "
  222.                    "ausgeschaltet. Loggen Sie sich bitte neu ein.\n";
  223.         break;
  224.  
  225.       default:
  226.         userhelp = "Bitte lesen Sie die UMS-Dokumentation.\n"
  227.                    "Hier finden Sie Hilfen zur Problemlösung \n"
  228.                    "und Fehlerbeseitigung.";
  229.         break;
  230.       }
  231.  
  232.       EasyRequest (0, &myES, NULL, err, errorstring, userhelp);
  233.     }
  234.   return (err);
  235. }
  236.  
  237.  
  238. //StrDup.c              /* kopiert und alloziert Stringspace */
  239.  
  240. /*
  241.  * strdup(const char *s)
  242.  *
  243.  * Kopiert den String, auf den s zeigt, reserviert Platz,
  244.  * gibt Zeiger auf den neuen String als Ergebnis zurück.
  245.  * Ausnahme: s = NULL. Dann wird kein Stringspeicher reserviert.
  246.  *
  247.  * Der reservierte Platz muß später mit free(neuerstring) an das
  248.  * System zurückgegeben werden.
  249.  *
  250.  * Benötigt strcpy(), malloc()
  251.  */
  252.  
  253. char *
  254. strdup (const char *string)
  255. {
  256.   /* Zeiger auf neuen String */
  257.   char *newstring;
  258.  
  259.   if (string)            /* wenn string vorhanden */
  260.     {
  261.       /* belege Speicher, kopiere String */
  262.       if (NULL != (newstring = malloc (strlen (string) + 1)))
  263.     strcpy (newstring, string);
  264.       return newstring;
  265.     }
  266.   else
  267.     return NULL;        /* wenn string = NULL */
  268. }
  269.  
  270.  
  271. // WindowClass
  272.  
  273. /*   todo
  274.    WindowClass
  275.    - WC_OPEN, WC_CLOSE
  276.    - winpointer
  277.    - Ereignistabelle als globale Execliste für die application.
  278.      Events aufnehmen. austragen. ändern. ausgeben.
  279.      Signal triggert --> Auswerten lt. Tabelle --> Routine starten
  280.      Problem: Datenstruktur der Ereignistabelle
  281. */
  282.  
  283. #define WC_NEW  11
  284. #define WC_DISPOSE 22
  285.  
  286. typedef struct wcdata
  287.  {
  288.  Window * wc_win;
  289.  /* weitere Daten hier hin */
  290.  };
  291.  
  292. ULONG
  293. WindowClass (ULONG * handle, ULONG type, ULONG taglist)
  294. {
  295.  
  296. switch(type)
  297. {
  298. case WC_NEW:
  299.      {
  300.       handle = (ULONG *)OpenWindowTags (NULL,
  301.           /* Defaults beachten */
  302.  
  303.                 WA_Flags, WFLG_DEPTHGADGET |
  304.                 WFLG_DRAGBAR |
  305.                 WFLG_CLOSEGADGET |
  306.                 WFLG_SIZEGADGET |
  307.                 WFLG_SIZEBBOTTOM |
  308.                 WFLG_SIZEBRIGHT,
  309.                 WA_Activate, TRUE,
  310.                 WA_SmartRefresh, TRUE,
  311.                 WA_IDCMP, CLOSEWINDOW |
  312.                 REFRESHWINDOW |
  313.                 LISTVIEWIDCMP |
  314.                 BUTTONIDCMP |
  315.                 IDCMP_NEWSIZE,
  316.                 WA_MinWidth, 200,
  317.                 WA_MinHeight, 80,
  318.                 WA_Title, NB_NAME,
  319.                 TAG_DONE);
  320.     break;
  321.     }
  322.  
  323. case WC_DISPOSE:
  324.     {
  325.     CloseWindow( (Window *) handle);
  326.     break;
  327.     }
  328. }
  329. return (TRUE);
  330. }
  331.  
  332. // Kludge
  333.  
  334. /* "Kludge:" Ersatz für fehlerhaftes "SetGadgetAttrs" in einer link-lib :-( */
  335. /* 25.12.95 */
  336.  
  337. ULONG 
  338. SetGadgetAttrsX (struct Gadget *gadget, struct Window *window,
  339.          struct Requester *requester, unsigned long tag1,...)
  340. {
  341.   return SetGadgetAttrsA (gadget, window, requester, (struct TagItem *) &tag1);
  342. }
  343.  
  344. /* verwende also SetGadgetAttrsX() statt dem Original <SetGadgetAttrs()> */
  345.